
#include "util.h"
#include "los_tick.h"
#include <string.h>

uint32_t TickerStart(void) {
    return LOS_TickCountGet();
}


bool TickerOut(uint32_t start, uint32_t duration_ticks) {
    uint32_t now = LOS_TickCountGet();
    // 处理tick计数器溢出
    if(now >= start) {
        if((now - start) >= duration_ticks)
        return true;
        else 
        return false;
    } else {
        if((UINT32_MAX - start + now) >= duration_ticks)
        return true;
        else 
        return false;
    }
}

bool TickerOutCheck(uint32_t time, uint32_t duration_ticks) {
    uint32_t now = LOS_TickCountGet();
    // 处理tick计数器溢出
    if( now>=time ) {
        if((now-time) >= duration_ticks)
        {
            return true;
        }
        else 
        {
            return false;
        }
        
    } 
}


uint32_t MS2TICKS(uint32_t ms) {
    // 假设系统tick频率为100Hz (每tick=10ms)
    return ms / 10; 
    // 实际值需根据LOSCFG_BASE_CORE_TICK_PER_SECOND调整
}


// 确保返回非零值的计时器起点
uint32_t TickerStart_RtnNonZero(void) {
    uint32_t tick = LOS_TickCountGet();
    
    // 如果当前tick为0，返回1（最小非零值）
//    return (tick == 0) ? 1 : tick;
    
    /* 更健壮的方案（处理tick即将溢出）*/
     return (tick == 0 || tick == UINT32_MAX) ? 1 : tick;
}


u16 LoadInt16_BigE(u8 *pData) {
    // 大端序转本地字节序
    return (u16)((pData[0] << 8) | pData[1]);
}

u32 LoadInt32_BigE(u8 *pData) {
    // 大端序转本地字节序
    return (u32)((pData[0] << 24) | (pData[1] << 16) | (pData[2] << 8) | pData[3]);
}

u16 LoadInt16(u8 *pData) {
    // 直接读取小端序数据
    return *(u16 *)pData; 
}

u32 LoadInt32(u8 *pData) {
    // 直接读取小端序数据（无需转换）
    return *(u32 *)pData; 
}

u8 CalChkSum(u8* array, u16 len) {
    u8 sum = 0;
    for (size_t i = 0; i < len; i++) { // 假设校验码是最后一个元素
        sum += array[i];
    }
    return (u8)sum;
}
